;var U = (function(window,document){
    /* 
*getStyle  获取非行间样式
*params   ele  {object}   元素
*params   attr  {String}  样式名
*/
function getStyle (ele, attr) {
    //处理  问浏览器有没有这个方法
    if (window.getComputedStyle) { //如果浏览器有这个方法  就是真
        //将获取的值返回出去
        return getComputedStyle(ele)[attr]
    } else { //ie

        return ele.currentStyle[attr]
    }
}

/* 
*move  运动
*params   ele  {object}   元素
*params   attr  {String}  样式名
*params   step  {number}  步长
*params   target  {number}  目标值
*params   callback  {function}  回调函数  可选
*/

function move (ele, attr, step, target, callback) {
    //判断step 是正值还是负值
    step = target > parseInt(getStyle(ele, attr)) ? step : -step
    //清楚定时器
    clearInterval(ele.timer)
    ele.timer = setInterval(function () {
        //让盒子在原来的位置基础上  - 10
        var speed = parseInt(getStyle(ele, attr)) + step
        //到达 目标值 0 停止  （条件合并）      speed 490    0

        //向右运动的条件 step>0    speed >= target
        //向左运动的条件 step<0    speed <= target

        if ((speed <= target && step < 0) || (speed >= target && step > 0)) {
            speed = target;
            clearInterval(ele.timer)
            //到达目标点  清楚定时器  调用回调函数
            callback && callback()
        }
        //赋值
        ele.style[attr] = speed + 'px'
    }, 30);
}


/* 
*getRandom  求几到几的随机整数  
*max {number}  最大值
*min {number}  最小值
*/
function getRandom (min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min)
}


/* 
*vertication  求n为的验证码  
*n {number}  验证码的位数
*/
function vertication(n){
    var str = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
    var s = ''//存储验证码
    for(var i=0;i<n;i++){
         s+=str[Math.floor(Math.random() * ((str.length-1) + 1))]  
    }
    return s
}
/* 
*norepeat  字符串去重
*str {string}  要去重的字符串
*/

function norepeat(str){
    var s = ''
    for(var i=0;i<str.length;i++){
        //空字符内没有找到这个字符
        if(s.indexOf(str[i])==-1){
            s+=str[i]
        }
    }
    //把去重过之后的是 return 出去
    return s
}
/* 
*addClass  添加class
*ele   {object} 元素
*value {string}  要添加的类名
*/

function addClass(ele,value){
    //判断元素有没有class值
    if(ele.className==''){//没有class
        ele.className = value
    }else{ //有class
        //判断有没有我要添加的class值  如果有 我就不添加  没有就（追加）
        if(ele.className.indexOf(value)==-1){//没有就（追加）
            ele.className = ele.className +" "+ value
        }
    }
}

/* 
*notrim  去除字符串中所有的空格
*str   {string}  去除所有空格的字符串
*/

function notrim(str){
    var s = ''
    for(var i =0;i<str.length;i++){
        //把不为空的选出来  拼接到空字符中
        if(str[i]!=' '){
            s+=str[i]
        }
    }
    return s
}

/* 
*oldYear  求周岁
*str   {string}  身份证号
*/

function oldYear(str){
    //取出出生年月
    var y=str.substr(6,4)
    var m=str.substr(10,2)
    //获取当前的年月
    var date =new Date()
    var  year = date.getFullYear()
    var  Mo= date.getMonth()+1

    if(Mo>m){
       return  (year - y) +1
    }else{
        return year - y
    }
}

/* 
*indexOf  查找字符  找到返回  下标  找不到返回-1
*str   {string}  需要查找的字符串
*s     {string}  要查找的字符
*startIndex   {number}   开始查找的下标   可选  不传默认为 0 
*/

function indexOf(str,s,startIndex){
    //判断有没有第三个参数  没有默认就是 0  有了 就是传的值
   startIndex =  startIndex==undefined?0:startIndex

   for(var i=startIndex;i<str.length;i++){
        if(str[i]==s){
            return i
        }
   }
   //for循环走完没找到 返回 -1
   return -1
}


/* 
*bind  事件绑定
*ele   {object}  元素
*type  {string}  事件类型
*eventFn   {function}   事件函数
*/

//兼容    元素  事件类型  事件函数
function  bind(ele,type,eventFn){
    //判断有没有这个方法  没有 就是假false
    if(ele.addEventListener){
        ele.addEventListener(type,eventFn,false)
    }else{
        ele.attachEvent('on'+type,eventFn)
    }
}


/* 
*bind  取消事件绑定
*ele   {object}  元素
*type  {string}  事件类型
*eventFn   {function}   事件函数
*/
function unbind(ele, type, eventFn) {
    if (ele.removeEventListener) {
        ele.removeEventListener(type, eventFn)
    } else {
        ele.detachEvent('on' + type, eventFn)
    }
}

/* 
*tbaox  弹框
*txt   {string}  提示信息
*/


function tbaox(txt){
    var timer =null;//存储定时器
    //创建box 
    var   maxbox= document.createElement('div')
    maxbox.style.cssText = "position: fixed;top: 0;left: 0;opacity: 0.7"
    //创建遮罩层
    var mark = document.createElement('div')
    mark.style.width = document.documentElement.clientWidth +'px'
    mark.style.height = document.documentElement.clientHeight +'px'
    mark.style.background="rgb(153, 151, 151)"

    //创建弹框
    var tanbox = document.createElement('div')
    tanbox.style.cssText = "position:absolute;width: 300px;height: 50px;border-radius: 10px;background: #000;opacity: 0.9;top: 50%;margin: -25px -150px;left: 50%"

    //创建删除按钮
    var del =document.createElement('span')
    //删除功能
    del.onclick=function(){
        this.parentNode.parentNode.remove()
    }
    del.innerHTML ="x"
    del.style.cssText ="width: 16px;height: 16px;line-height: 14px;border-radius: 50%;background: #ccc;opacity: .7;position: absolute;color: #000;right: 2px;text-align: center;top:2px;cursor: pointer;"
    //消息
    var msg =document.createElement('p')
    msg.innerHTML = txt
    msg.style.cssText = " width: 100%;height: 50px;text-align: center;line-height: 16px;margin-top: 15px;color: white;"

    //添加
    tanbox.appendChild(del)
    tanbox.appendChild(msg)
    maxbox.appendChild(mark)
    maxbox.appendChild(tanbox)

    //添加到页面
    var body =document.querySelector('body')
    body.appendChild(maxbox)


    timer = setTimeout(function(){
        maxbox.remove()
        clearTimeout(timer)
    },3000)
}

/* 
*drag  元素拖拽
*ele   {object}  元素    必须要定位
*/


function drag(ele){
    ele.onmousedown=function(ev){
    //判断是否是ie浏览器
    if(ele.setCapture){
        //设置全局捕获
        ele.setCapture()
    }

     var  ev =window.event || ev
     //1.取出鼠标距离元素左边的距离
    var downy =ev.clientY - ele.offsetTop
    var downx =ev.clientX - ele.offsetLeft

    //移动
    document.onmousemove=function(ev){
        var ev= window.event ||ev
        //求出盒子应该移动的距离
        var moveX = ev.clientX - downx
        var moveY = ev.clientY - downy
        //限制范围
        if(moveX<0) moveX = 0
        //盒子移动的最大距离 
        var maxX  = document.documentElement.clientWidth - ele.offsetWidth
        var maxY  = document.documentElement.clientHeight - ele.offsetHeight
        // console.log(maxX);

        if(moveX>maxX) moveX =maxX
        if(moveY<0) moveY = 0
        if(moveY >maxY) moveY = maxY
        //不断赋值
        ele.style.left = moveX +'px'
        ele.style.top = moveY +'px'
    }
    //抬起取消move事件
    document.onmouseup=function(){
        document.onmousemove = null

        //抬起释放全局捕获
        //判断是否是ie
        if(ele.releaseCapture){
            //释放全局捕获
            ele.releaseCapture()
        }
    }
    //阻止默认行为
    return false
 }
}


/* 
*solomove  单属性运动
*ele   {object}  元素    必须要定位
*target   {number}  目标值
*attr   {string}  运动的属性
*/


 //合并
 function solomove(ele,target,attr){
    //频繁触发的地方 清楚定时器
    clearInterval(ele.timer)
    ele.timer = setInterval(function(){
     //获取div当前的位置
     var current = parseInt(getStyle(ele,attr))
     //避免speed 有小数问题  向上取整
     var speed = (target - current)/10
     speed = speed>0?Math.ceil((target - current)/10): Math.floor((target - current)/10)
     /* 
     speed  >0  向上取整   Math.ceil((target - current)/10)
     speed  <0  向下取整   Math.floor((target - current)/10)
     */
     //到达位置清楚定时器
     if(current  == target){
         clearInterval(ele.timer)
     }
     ele.style[attr] =current + speed + "px"
 },30)
}

/* 
*opacity  透明度运动
*ele   {object}  元素   
*target   {number}  目标值
*attr   {string}  运动的属性
*/

function opacity(ele,target,attr){
    //清楚定时器
    clearInterval(ele.timer)
     // 目标值  都扩大100倍
     target = target*100 
    ele.timer =setInterval(function(){
     //当前值和目标值  都扩大100倍
     var  current  = parseInt(getStyle(ele,attr)*100) 
     //求速度
     var speed =(target-current) /10
     speed = speed>0?Math.ceil((target-current) /10):Math.floor((target-current) /10)

     console.log(speed);
     if(current==target){
         clearInterval(ele.timer)
     }
     ele.style[attr]= (current + speed)/100
 },30)
}
/* 
*solomoveopacity  属性运动
*ele   {object}  元素   
*target   {number}  目标值
*attr   {string}  运动的属性
*/
function solomoveopacity(ele,target,attr){
    //频繁触发的地方 清楚定时器
    clearInterval(ele.timer)
    ele.timer = setInterval(function(){
    //判断是否是opacity
    if(attr == 'opacity'){
        // 目标值  都扩大100倍
        var end = target*100 
        
    }
     //获取div当前的位置
     //判断是否是opacity
     if(attr == 'opacity'){
        //当前值和目标值  都扩大100倍
        var  current  = parseInt(getStyle(ele,attr)*100) 
        //避免speed 有小数问题  向上取整
        var speed = (end - current)/10
        speed = speed>0?Math.ceil((end - current)/10): Math.floor((end - current)/10)
     }else{
        var current = parseInt(getStyle(ele,attr))
        //避免speed 有小数问题  向上取整
        var speed = (target - current)/10
        speed = speed>0?Math.ceil((target - current)/10): Math.floor((target - current)/10)
     }
     /* 
     speed  >0  向上取整   Math.ceil((target - current)/10)
     speed  <0  向下取整   Math.floor((target - current)/10)
     */
     //到达位置清楚定时器
     if(current  == target){
         clearInterval(ele.timer)
     }
     if(attr == 'opacity'){
        ele.style[attr]= (current + speed)/100
     }else{
        ele.style[attr] =current + speed + "px"
     }
 },30)
}

/* 
*solomoveopacity  属性运动
*ele   {object}  元素   
*obj   {object}  {   属性1：目标值1,属性2：目标值2}
*callback  回调函数
*/

function bufferMove(ele, obj, callback) {
    //频繁触发的地方 清楚定时器
    clearInterval(ele.timer)
    ele.timer = setInterval(function () {
        var flag = '到了'
        //循环得到属性和目标值 并且挨个替换
        for (var key in obj) {
            // key  就是运动的属性     obj[key]  就是目标值
            //判断是否是opacity
            if (key == 'opacity') {
                // 目标值  都扩大100倍
                var end = obj[key] * 100
            }
            //获取div当前的位置
            //判断是否是opacity
            if (key == 'opacity') {
                //当前值和目标值  都扩大100倍
                var current = parseInt(getStyle(ele, key) * 100)
                //避免speed 有小数问题  向上取整
                var speed = (end - current) / 10
                speed = speed > 0 ? Math.ceil((end - current) / 10) : Math.floor((end - current) / 10)
            } else {
                var current = parseInt(getStyle(ele, key))
                //避免speed 有小数问题  向上取整
                var speed = (obj[key] - current) / 10
                speed = speed > 0 ? Math.ceil((obj[key] - current) / 10) : Math.floor((obj[key] - current) / 10)
            }
            // console.log('停了吗');
            /* 
            speed  >0  向上取整   Math.ceil((target - current)/10)
            speed  <0  向下取整   Math.floor((target - current)/10)
            */
            //到达位置清楚定时器 
            if (current != obj[key]) {
                flag = '没到'  
            }
            if (key == 'opacity') {
                ele.style[key] = (current + speed) / 100
            } else {
                ele.style[key] = current + speed + "px"
            }

            //for循环结束之后如果flag = '到了'   表示 都到达目标点了
            if(flag == '到了'){
                clearInterval(ele.timer)
                //  callback()
                //判断是否有回调
                callback && callback()
            }

        }

    }, 30)
}
/* 
*  如果没有data就给一个''

*/

function ajax(url, method,data,callback) {
    // 1、创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest()

    //2、打开

    if (method.toLocaleLowerCase() == 'get') {
        //判断有没有参数
        if (data) {
            url = url + '?' + data
        }
        xhr.open(method, url, true)
        //3、发送
        xhr.send()



    } else {
        xhr.open(method, url, true)
        //设置请求头
        xhr.setRequestHeader('Content-type', "application/x-www-form-urlencoded")

        //发送
        if (data) {
            xhr.send(data)
        } else {
            xhr.send()
        }
    }
    //4注册监听事件
    xhr.onreadystatechange = function () {
        //5、监听ajax==4    服务器==200
        if (xhr.readyState == 4 && xhr.status == 200) {
            //可以获取到数据，正常渲染页面
            // console.log(JSON.parse(xhr.responseText));
            callback(JSON.parse(xhr.responseText))
        }
    }

}


function ajaxObj(obj) {
    // 1、创建XMLHttpRequest对象
    var xhr = new XMLHttpRequest()
    //2、打开
    if (obj.method.toLocaleLowerCase() == 'get') {
        //判断有没有参数
        if (obj.data) {
            obj.url = obj.url + '?' + obj.data
        }
        xhr.open(obj.method, obj.url, true)
        //3、发送
        xhr.send()
    } else {
        xhr.open(obj.method, obj.url, true)
        //设置请求头
        xhr.setRequestHeader('Content-type', "application/x-www-form-urlencoded")
        //发送
        if (obj.data) {
            xhr.send(obj.data)
        } else {
            xhr.send()
        }
    }
    //4注册监听事件
    xhr.onreadystatechange = function () {
        //5、监听ajax==4    服务器==200
        if (xhr.readyState == 4 && xhr.status == 200) {
            //可以获取到数据，正常渲染页面
            // console.log(JSON.parse(xhr.responseText));
            obj.success(JSON.parse(xhr.responseText))
        }
    }

}

return {
    bufferMove,
    solomoveopacity,
    opacity,
    solomove,
    drag,
    tbaox,
    unbind,
    bind,
    indexOf,
    oldYear,
    notrim,
    addClass,
    norepeat,
    vertication,
    getRandom,
    move,
    getStyle,
    ajax,
    ajaxObj
}
})(window,document)